package org.ala.tiktools.rpc.netty.handler;

import io.netty.buffer.ByteBuf;
import org.ala.tiktools.logs.LoggerFactory;
import org.ala.tiktools.rpc.msg.RpcMsg;
import org.ala.tiktools.rpc.msg.RpcMsgHead;
import org.ala.tiktools.rpc.msg.RpcMsgHeadTypeEnums;
import org.ala.tiktools.rpc.netty.handler.ack.RpcAckMsgDecoderEncoder;
import org.ala.tiktools.rpc.netty.handler.login.RpcLoginErrorMsgDecoderEncoder;
import org.ala.tiktools.rpc.netty.handler.login.RpcLoginMsgDecoderEncoder;
import org.ala.tiktools.rpc.netty.handler.login.RpcLoginNoMsgDecoderEncoder;
import org.ala.tiktools.rpc.netty.handler.login.RpcLoginSuccessMsgDecoderEncoder;
import org.ala.tiktools.rpc.netty.handler.ping.RpcPingMsgDecoderEncoder;
import org.ala.tiktools.rpc.netty.handler.pong.RpcPongMsgDecoderEncoder;
import org.ala.tiktools.rpc.netty.handler.push.RpcPushMsgDecoderEncoder;
import org.ala.tiktools.rpc.netty.handler.terminate.RpcTerminateMsgDecoderEncoder;
import org.ala.tiktools.tools.kv.KV;
import org.ala.tiktools.tools.kv.Maps;
import org.slf4j.Logger;

import java.util.Map;


/**
 * 无状态，全局单例就好
 *
 * @author ala
 * @date 2025-04-08 10:08
 */
@SuppressWarnings("rawtypes")
public interface IRpcMsgDecoderEncoder<T extends RpcMsg> {
    /**
     *  日志
     */
    public static Logger log = LoggerFactory.getLogger("rpc", "decoder-encoder");
    /**
     *  消息类型和编解码器映射
     */
    @SuppressWarnings("unchecked")
	public static Map<RpcMsgHeadTypeEnums, IRpcMsgDecoderEncoder> mapper = Maps.build(
            KV.build(RpcMsgHeadTypeEnums.PUSH, RpcPushMsgDecoderEncoder.INSTANCE),
            KV.build(RpcMsgHeadTypeEnums.ACK, RpcAckMsgDecoderEncoder.INSTANCE),

            KV.build(RpcMsgHeadTypeEnums.PING, RpcPingMsgDecoderEncoder.INSTANCE),
            KV.build(RpcMsgHeadTypeEnums.PONG, RpcPongMsgDecoderEncoder.INSTANCE),

            KV.build(RpcMsgHeadTypeEnums.LOGIN, RpcLoginMsgDecoderEncoder.INSTANCE),
            KV.build(RpcMsgHeadTypeEnums.LOGIN_SUCCESS, RpcLoginSuccessMsgDecoderEncoder.INSTANCE),
            KV.build(RpcMsgHeadTypeEnums.LOGIN_ERROR, RpcLoginErrorMsgDecoderEncoder.INSTANCE),
            KV.build(RpcMsgHeadTypeEnums.LOGIN_NO, RpcLoginNoMsgDecoderEncoder.INSTANCE),

            KV.build(RpcMsgHeadTypeEnums.TERMINATE, RpcTerminateMsgDecoderEncoder.INSTANCE)
    );


    /**
     *  解码消息体
     */
    T decode(RpcMsgHead head, ByteBuf in);


    /**
     *  编码消息体
     *  <p> 消息头中除了len，其他应该已经设置好了
     */
    void encoder(T msg, ByteBuf out);
}
